package com.xuecheng.content.convert;

import com.xuecheng.api.content.model.dto.CourseBaseDTO;
import com.xuecheng.api.content.model.vo.CourseAuditVO;
import com.xuecheng.api.content.model.vo.CourseBaseVO;
import com.xuecheng.content.entity.CourseBase;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * po 转 dto
 *
 * @author lily
 * @date 2021/12/08
 */
@Mapper // 不添加这个注解，无法利用反射
public interface CourseBaseConvert {

    CourseBaseConvert INSTANCE = Mappers.getMapper(CourseBaseConvert.class);


    /**
     * 单个实体类转 dto
     *
     * @param courseBase
     * @return {@link CourseBaseDTO}
     *
     * 这个映射注解应该打在单个映射，因为多个是直接调用的他
     * 第一个参数是dto的参数名字，第二个参数是pojo的名字
     */
    @Mapping(target = "courseBaseId", source = "id")
    CourseBaseDTO entity2dto(CourseBase courseBase);


    /**
     * 多个实体类转 dto，单这个依赖于单个实体类转 dto
     *
     * @param courseBases 课程基地
     * @return {@link List}<{@link CourseBaseDTO}>
     *         @Mappings({
     *             @Mapping(target = "", source = "")
     *          })
     *          当pojo 和 dto 属性名不一致时，需要使用此注解，多个用Mappings，单个用 Mapping
     */
    List<CourseBaseDTO> entities2dtos(List<CourseBase> courseBases);


    /**
     * 单个 前端传递的 vo 转化成 dto
     *
     * @param courseBaseVO 课程基础签证官
     * @return com.xuecheng.api.content.model.dto.CourseBaseDTO
     * @author Lily
     * @date 2021/12/11 16:36
     * @paramType [com.xuecheng.api.content.model.vo.CourseBaseVO]
     * @description
     */
    CourseBaseDTO vo2dto(CourseBaseVO courseBaseVO);


    /**
     * 单个 dto转成 po实体类
     *
     * @param courseBaseDTO 课程基础dto
     * @return com.xuecheng.content.entity.CourseBase
     * @author Lily
     * @date 2021/12/11 17:36
     * @paramType [com.xuecheng.api.content.model.dto.CourseBaseDTO]
     * @description
     * po 和 dto 的 id 字段不同，因此必须加上这个，否则无法封装id
     */
    @Mapping(target = "id", source = "courseBaseId")
    CourseBase dto2entity(CourseBaseDTO courseBaseDTO);


    /**
     * 单个 vo 转成 dto
     *
     * @param courseAuditVO 课程审核vo
     * @return com.xuecheng.content.entity.CourseBase
     * @author Lily
     * @date 2021/12/11 17:36
     * @paramType [com.xuecheng.api.content.model.dto.CourseBaseDTO]
     * @description
     * po 和 dto 的 id 字段不同，因此必须加上这个，否则无法封装id
     */
    CourseBaseDTO vo2dto(CourseAuditVO courseAuditVO);
}
